// 后台进程 类似于 Windows 中的 服务
// 守护进程 不一定是开机启动



/*
创建子进程，退出父进程。
在子进程中调用 setsid() 创建新的会话，使子进程成为新的会话首进程，并脱离终端控制。
将当前工作目录更改为根目录，以防止占用挂载点。 chdir()
重设文件权限掩码，以避免继承父进程的权限掩码。umask
关闭不再需要的文件描述符（如标准输入、输出、错误）。
守护进程进入一个无限循环，执行预定的任务。
*/

#include <head.h>


int main(int argc, char const *argv[])
{
    pid_t pid = 0;
    // 创建子进程，
    if(-1 == (pid = fork()))
    {
        ERRLOG("进程创建失败");
        exit(0);
    }
    // 退出父进程
    if(pid > 0)
    {
        exit(0);
    }
    // setsid() 创建新的会话
    if(setsid() == -1)
    {
        ERRLOG("会话创建失败");
        exit(0);
    }
    // chdir() 修改工作目录
    if (chdir("/") == -1)
    {
        ERRLOG("工作目录修改失败");
        exit(0);
    }
    // umask 重设文件权限掩码
    umask(0);

    // 关闭不需要的文件
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // 死循环 执行任务   .log
    while (1)
    {
        // 打开文件
        FILE * fp = fopen( "/tmp/hqyj.log" , "a");
        if (NULL == fp)
        {
            exit(0);
        }
        time_t c_time = time(NULL);
        fprintf( fp , "%s  小谭老师最帅\n"  , ctime(&c_time) );
        
        fclose(fp);


        sleep(5);
    }
    /*
        写守护进程 最好不要是运行态  
        所以 while 中 需要增加 sleep
    */

    return 0;
}


